#include "iostream"

using namespace std;

#define MaxSize 10

struct ElemType{
	char n;
};
typedef struct Stack{
	ElemType data[MaxSize];
	int top;
}SqStack;

void init(SqStack &S);
void destory(SqStack &S);

void push(SqStack &S,ElemType e);
void pop(SqStack &S,ElemType &e);

void getTop(SqStack &S,ElemType &e);
bool isEmpty(SqStack S);

bool bracketCheck(char str[],int length){
	SqStack S;
	init(S);
	ElemType e;
	for(int i=0;i<length;i++){
		if(str[i]=='(' || str[i]=='[' || str[i]=='{'){	
			e.n=str[i];
			push(S,e);
		}else{
			if(isEmpty(S))
				return false;
			ElemType e;
			pop(S,e);
			if(str[i]==')' && e.n!='(')
				return false;
			if(str[i]==']' && e.n!='[')
				return false;
			if(str[i]=='{' && e.n!='}')
				return false;
		}
	}
	return isEmpty(S);
}


int main(){
	 
	 char chs[10]={"((()))))"};
	 printf("%d",bracketCheck(chs,8));
	return 0;
}






void init(SqStack &S){
	S.top=-1;
}
void destory(SqStack &S){
	S.top=-1;
}
bool isEmpty(SqStack S){
	if(S.top==-1)
		return true;
	return false;
}
void push(SqStack &S,ElemType e){
	if(S.top==MaxSize-1)
		return ;
	S.data[++S.top] = e;
}
void pop(SqStack &S,ElemType &e){
	if(isEmpty(S))
		return;
	e = S.data[S.top--];
}

void getTop(SqStack &S,ElemType &e){
	if(isEmpty(S))
		return;
	e = S.data[S.top];
}